podmanからECRを利用する
podmanとECRについて
podmanはコンテナの開発、管理、実行を行うためのエンジンです。 Dockerと同様にコンテナイメージのレジストリに対して、イメージを登録、取得することが可能です。
Amazon Elastic Container Registry(以下 ECR)はAWSが提供するコンテナイメージのレジストリです。 ECR上ではコンテナイメージの保存等の管理が可能です。
ECRについては以下の記事が参考になるかと思います。
今回はPodmanでのECR上のイメージの登録(Push)と取得(Pull)までの流れを整理します。
今回の説明では省略するもの
以下のものが必要ですが、説明の簡略化のため省略します。
- IAMの認証情報(イメージのPushに必要)及び権限
- ECRのリポジトリ
- コンテナイメージ(今回はDockerの公式イメージのalpineのイメージを使用します。)
PodmanからECRを使う
以下のような流れで作業を行います。
- コンテナレジストリの認証ヘルパーの導入
- ECRへのイメージの登録(Push)
- ECRからのイメージの取得(Pull)
コンテナレジストリの認証ヘルパーの導入
今回はamazon-ecr-credential-helper
を利用します。
認証ヘルパーを使用しない場合のログイン方法については付録に記載しておきます。
これは、ECRへのアクセスに際して必要な認証情報をDockerに渡してくれる便利なプラグインのようなものです。 もともとはDocker用ですがPodmanでも問題なく使用できます。
インストール
自分はMacOSを使用しているのでHomebrew形式でインストールしました。 他のOSについては先程のGithubのページにインストール方法が書いてあります。
$ brew install docker-credential-helper-ecr
設定
~/.docker/config.json
に以下の内容を追加します。
~/.docker/config.json
は元々はDokcer用の設定ファイルですが、podmanもここを参照してくれます。(さすが!)
{ "credHelpers": { "public.ecr.aws": "ecr-login", "<aws_account_id>.dkr.ecr.<region>.amazonaws.com": "ecr-login" } }
以下の部分は自分の環境に合わせて適宜書き換えてください。
- <aws_account_id>: ECRリポジトリのあるAWSアカウントID
- <region>: ECRリポジトリのあるリージョン(例: ap-northeast-1)
以下ではDockerHubの公式イメージのAlpineLinuxのイメージをECRに登録しています。
ECRへのイメージの登録(Push)
上記の設定を済ませたら、後は他のレジストリと同じように使うことができます。
# Push用のタグ付 $ podman tag docker.io/library/alpine <aws_account_id>.dkr.ecr.<region>.amazonaws.com/<repository_name>:latest # $ podman push <aws_account_id>.dkr.ecr.<region>.amazonaws.com/<repository_name>:latest
ここでも<aws_account_id>と<region>は適切な値に書き換えてください。 <repository_name>はイメージを登録したいECRのリポジトリ名です。
認証情報の渡し方
authentication required
のようなエラーメッセージが表示される場合は適切な認証情報が使われていない可能性が高いです。
amazon-ecr-credential-helper
では以下の方法でAWSへの認証情報を渡すことができます。
ここでは個人的によく使う以下の2つの方法を列挙しておきます。
- 環境変数
AWS_PROFILE
での認証情報のプロファイルの使用(スイッチロールする場合はこちらが多いかと思います) - 環境変数
AWS_ACCESS_KEY_ID
,AWS_SECRET_ACCESS_KEY
を使用した認証
他にもAWSへの認証情報の渡し方は以下に書いてあります。
認証情報の渡し方に問題が無いようでしたら、使用しているIAMユーザー、IAMロールの権限を一度確認してください。
ECRからのイメージの取得(Pull)
最後にECRからPodmanでイメージを取得してみます。 これもほぼ、ECR以外から取得する場合と同じです。
これを実行する前に予めDockerHubから取得したAlpineLinxuのイメージは削除してあります。
$ podman pull <aws_account_id>.dkr.ecr.<region>.amazonaws.com/<repository_name>:latest
ここでも<aws_account_id>,<region>,<repository_name>は適切な値に書き換えてください。
最後に
amazon-ecr-credential-helper
のような認証ヘルパーに対応してくれているのはありがたいですね。
得に大きな障壁もなくECRをPodmanから利用することができました。
付録
以下では認証ヘルパーを使用しなかった場合のログイン方法を整理しておきます。
認証情報を使用しない場合はpodman login
にパスワードを入力する必要があります。
このあたりはDockerと同じですね。
$ aws ecr get-login-password --region ap-northeast-1 | podman login --username AWS --password-stdin <aws_account_id>.dkr.ecr.<region>.amazonaws.com